// use std::{collections::HashSet , ffi::OsString, path::PathBuf} ;
// use serde::Serialize;  // 提供序列化能力
// use jizi_fs::{CWD,Xdg , expand_path} ; // 暂时没有开发
// 
// #[derive(Debug , Default , Serialize)]   // 派生属性 支持打印调试结构体内容  提供默认初始化方法  支持序列化
// pub struct Boot{
//     pub cwds: Vec<PathBuf>,
//     pub files:Vec<OsString>,
// 
//     pub local_events:HashSet<String> ,
//     pub remote_events:HashSet<String> , 
// 
//     pub config_dir : PathBuf, 
//     pub flavor_dir : PathBuf , 
//     pub plugin_dir: PathBuf , 
//     pub state_dir : PathBuf,
// }
// 
// impl Boot{
//     fn parse_entries(entries : &[PathBuf]) -> (Vec<PathBuf>,Vec<OsString>) {
//         /*
//         工作原理：
//         如果传递的路径参数为空，则默认使用当前工作目录作为父目录，并创建一个空的 OsString 作为文件名。
//         否则，为每个路径参数创建两个向量：cwds 和 files。cwds 向量将包含每个路径的父目录，而 files 向量将包含每个路径的文件名。
//         对于每个路径参数，使用 expand_path 函数将其展开为绝对路径。
//         如果路径参数是一个文件（而不是目录），则将其父目录添加到 cwds 向量中，并将文件名添加到 files 向量中。如果路径参数是一个目录，则将其本身添加到 cwds 向量中，并将一个空的 OsString 添加到 files 向量中。
//         返回 (cwds, files) 作为结果
//          */
//         if entries.is_empty() {
//             return (vec![CWD.load().to_path_buf()], vec![OsString::new()]) ; 
//         }
//         let mut cwds = Vec::with_capacity(entries.len()) ;
//         let mut files = Vec::with_capacity(entries.len()) ;
//         
//         for entry in entries.iter().map(expand_path){
//             if let Some(p) = entry.parent().filter(|_| !entry.is_dir()) {
//                 cwds.push(p.to_owned()) ; 
//                 files.push(entry.file_name().unwrap().to_owned()) ;
//             }else {
//                 cwds.push(entry) ;
//                 files.push(OsString::new()) ;
//             }
//         }
//         (cwds, files) 
//     }
// }
// 
// impl From<&crate::Args> for Boot{ // 为Boot实现From trait
//     fn from(args:&crate::Args) -> Self{  // 将命令行参数转化成Boot结构体
//         let config_dir = Xdg::config_dir(); // 基础配置目录的路径
//         let (cwds , files) = Self::parse_entries(&args.entries) ; // 将entries分为目录和文件名列表
// 
//         let local_events = args // 解析本地事件
//         .local_events
//         .as_ref()
//         .map(|s| s.split(',').map(|s| s.to_owned()).collect())
//         .unwrap_or_default() ;
// 
//         let remote_events = args // 解析远程事件
//         .remote_events
//         .as_ref()
//         .map(|s| s.split(',').map(|s| s.to_owned()).collect())
//         .unwrap_or_default();
// 
//         Self {  // 组合所有字段  返回Boot类型
//             cwds, 
//             files, 
//             local_events,
//             remote_events, 
//             config_dir, 
//             flavor_dir: config_dir.join("flavors") , // 在基础配置路径上派生子目录
//             plugin_dir: config_dir.join("plugins") ,  // 同上
//             state_dir: Xdg::state_dir() ,  
//         }
//     }
// }
// // OsString的知识小结
// /*
// ffi::OsString 是 Rust 标准库中 std::ffi 模块提供的一个类型，用于处理与操作系统（OS）相关的字符串。
// 它和 ffi::OsStr 一起，用于在 Rust 代码中与外部的、可能使用不同编码的字符串进行交互。
// ffi::OsString 和 ffi::OsStr 与 Rust 中的其他字符串类型（如 String 和 &str）不同，它们没有 UTF-8 编码的限制，可以包含任何字节序列，包括非法的 Unicode 编码。
// 这使得它们在与外部代码交互时非常有用，因为外部代码可能使用不同的编码，或者根本不使用 Unicode 编码。
// ffi::OsString 和 ffi::OsStr 还提供了一些方法，用于将它们与其他字符串类型进行转换。
// 例如，ffi::OsString 有一个 into_string 方法，可以将一个 ffi::OsString 转换为一个 String，前提是它包含有效的 Unicode 数据。
// 如果转换失败，则返回原始的 ffi::OsString。
// 总的来说，ffi::OsString 和 ffi::OsStr 是 Rust 中用于处理与操作系统相关的字符串的类型，它们在与外部代码交互时非常有用。
// 如果你需要处理可能包含非法 Unicode 编码的字符串，或者需要与使用不同编码的外部代码交互，那么使用 ffi::OsString 和 ffi::OsStr 是一个不错的选择。
// */